library(tidyverse)
library(cowplot)
library(maps)
library(ggforce)
library(viridis)
studies <- read_csv("../data/studies_gsheet.csv")
sites <- read_csv("../data/sites_gsheet.csv")
df <- studies %>% 
  group_by(site) %>% 
  summarise(Nstudies = n_distinct(studyID),
            Nspecies = n_distinct(species)) %>% 
  left_join(sites)
Joining, by = "site"
world <- map("world", plot = FALSE, fill = TRUE) %>% fortify()
# sanity check that coordinates are in the right country
# within a country, all Xs should be the same color
ggplot(df, aes(x = long, y = lat)) +
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90") +
  geom_point(aes(col = country), size = 5, shape = 4, stroke = 2, alpha = .8) +
  coord_fixed(1.3, ylim = c(-55, 83.59961)) +
  scale_color_viridis_d() +
  theme_map() +
  guides(col = "none")

rr ggsave(../graphs/map.pdf, width = 20, height = 10, scale = 2)

Zoom in on sections

# japan
m1 <- m + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nstudies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(25, 45), xlim = c(125, 145)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
# europe
m2 <- m + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nstudies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(32, 60), xlim = c(-10, 30)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
# contiguous us
usa = map("state", plot = FALSE, fill = TRUE) %>% fortify() # "usa"
m3 <- m + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_polygon(data = usa, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nstudies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(25, 49), xlim = c(-127, -67)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
leg <- plot_grid(NA, legend, ncol = 1, rel_heights = c(.1, .9), labels = c("", "Number of Studies"), label_x = -.35)
Cannot convert object of class logical into a grob.
bottom_row <- plot_grid(m3, m2, NA, m1, NA, leg, nrow = 1, rel_widths = c(2, 1.18, .06, .85, .08, .7))
Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Cannot convert object of class logical into a grob.Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Cannot convert object of class logical into a grob.
plot_grid(mx, bottom_row, ncol = 1, rel_heights = c(2.4, 1)) +
  theme(plot.margin = unit(c(.5, .5, 1.5, .5), "cm"))
Removed 3 rows containing missing values (geom_point).

ggsave("../graphs/map_insets.pdf", width = 8, height = 5.5, scale = 2)

Color = No species

ms <- ggplot(df, aes(x = long, y = lat)) +
  geom_polygon(data = world, aes(group = group), fill = "grey90") +
  geom_point(aes(size = Nstudies, fill = Nspecies), shape = 21, alpha = .8) +
  theme_map() +
  # # to make fill into discrete; overlap with size legend
  # scale_size_area("Number of\nStudies", max_size = 15) +
  # scale_fill_viridis_c("Number of\nStudies", guide = "legend") +
  # to have them side by side
  scale_fill_gradientn("", breaks = c(1, 11), colours = c("#598cde","#d4e324", "black")) +
  scale_size_area("", max_size = 15, breaks = c(1, 20, 40, 60)) +
  theme(legend.box = "horizontal") +
  guides(fill = guide_colorbar(reverse = T, barheight = 9.5, order = 1), 
         size = guide_legend(keyheight = 2.6, title.theme = element_text(size = 4)))
legend <- get_legend(ms)
Removed 3 rows containing missing values (geom_point).
# plot_grid(legend)
msx <- ms +
  annotate("rect", ymin = c(24, 31, 24), ymax = c(46, 62, 50), xmin = c(124, -12, -130), 
           xmax = c(146, 32, -64), size = .5, col = "grey", fill = NA) + 
  coord_fixed(1.3, ylim = c(-55, 83.59961)) +
  theme(legend.position = "none")

Zoom in on sections

# japan
ms1 <- ms + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nspecies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(25, 45), xlim = c(125, 145)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
# europe
ms2 <- ms + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nspecies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(32, 60), xlim = c(-10, 30)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
# contiguous us
usa = map("state", plot = FALSE, fill = TRUE) %>% fortify() # "usa"
ms3 <- ms + 
  geom_polygon(data = world, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_polygon(data = usa, aes(group = group), col = "black", fill = "grey90", lwd = .2) +
  geom_point(aes(size = Nstudies, fill = Nspecies), shape = 21, alpha = .8) +
  coord_fixed(1.3, ylim = c(25, 49), xlim = c(-127, -67)) +
  theme(legend.position = "none") +
  panel_border(color = "grey", size = .5)
legs <- plot_grid(NA, legend, ncol = 2, rel_heights = c(.1, .9), labels = c("Species", "Studies"), label_x = -.1)
Cannot convert object of class logical into a grob.
bottom_row <- plot_grid(ms3, ms2, NA, ms1, NA, legs, nrow = 1, rel_widths = c(2, 1.18, .06, .85, .08, .7))
Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Cannot convert object of class logical into a grob.Removed 3 rows containing missing values (geom_point).Removed 3 rows containing missing values (geom_point).Cannot convert object of class logical into a grob.
plot_grid(msx, bottom_row, ncol = 1, rel_heights = c(2.4, 1)) +
  theme(plot.margin = unit(c(.5, .5, 1.5, .5), "cm"))
Removed 3 rows containing missing values (geom_point).

ggsave("../graphs/map_insets_col_species.pdf", width = 8, height = 5.5, scale = 2)

Session Info

rr sessionInfo()

R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.5

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] viridis_0.5.1     viridisLite_0.3.0 ggforce_0.3.1     maps_3.3.0        cowplot_1.0.0    
 [6] forcats_0.4.0     stringr_1.4.0     dplyr_0.8.3       purrr_0.3.2       readr_1.3.1      
[11] tidyr_1.0.0       tibble_2.1.3      ggplot2_3.2.1     tidyverse_1.2.1  

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.2         lubridate_1.7.4    lattice_0.20-38    prettyunits_1.0.2  ps_1.3.0          
 [6] assertthat_0.2.1   zeallot_0.1.0      digest_0.6.21      R6_2.4.0           cellranger_1.1.0  
[11] backports_1.1.5    stats4_3.6.1       evaluate_0.14      httr_1.4.1         pillar_1.4.2      
[16] rlang_0.4.0        lazyeval_0.2.2     readxl_1.3.1       rstudioapi_0.10    callr_3.3.2       
[21] rmarkdown_1.16     labeling_0.3       loo_2.1.0          polyclip_1.10-0    munsell_0.5.0     
[26] broom_0.5.2        compiler_3.6.1     modelr_0.1.5       xfun_0.10          rstan_2.19.2      
[31] base64enc_0.1-3    pkgconfig_2.0.3    pkgbuild_1.0.5     htmltools_0.4.0    tidyselect_0.2.5  
[36] gridExtra_2.3      matrixStats_0.55.0 crayon_1.3.4       withr_2.1.2        MASS_7.3-51.4     
[41] grid_3.6.1         nlme_3.1-141       jsonlite_1.6       gtable_0.3.0       lifecycle_0.1.0   
[46] magrittr_1.5       StanHeaders_2.19.0 scales_1.0.0       cli_1.1.0          stringi_1.4.3     
[51] farver_1.1.0       xml2_1.2.2         generics_0.0.2     vctrs_0.2.0        tools_3.6.1       
[56] glue_1.3.1         tweenr_1.0.1       hms_0.5.1          yaml_2.2.0         parallel_3.6.1    
[61] processx_3.4.1     inline_0.3.15      colorspace_1.4-1   rvest_0.3.4        knitr_1.25        
[66] haven_2.1.1       
LS0tCnRpdGxlOiAiU2l0ZXMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY3NzOiBzdHlsZS5jc3MKICAgIHRoZW1lOiBwYXBlcgotLS0KCmBgYHtyIHNldHVwLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KG1hcHMpCmxpYnJhcnkoZ2dmb3JjZSkKbGlicmFyeSh2aXJpZGlzKQpgYGAKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpzdHVkaWVzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3N0dWRpZXNfZ3NoZWV0LmNzdiIpCnNpdGVzIDwtIHJlYWRfY3N2KCIuLi9kYXRhL3NpdGVzX2dzaGVldC5jc3YiKQpgYGAKCmBgYHtyfQpkZiA8LSBzdHVkaWVzICU+JSAKICBncm91cF9ieShzaXRlKSAlPiUgCiAgc3VtbWFyaXNlKE5zdHVkaWVzID0gbl9kaXN0aW5jdChzdHVkeUlEKSwKICAgICAgICAgICAgTnNwZWNpZXMgPSBuX2Rpc3RpbmN0KHNwZWNpZXMpKSAlPiUgCiAgbGVmdF9qb2luKHNpdGVzKQpgYGAKCmBgYHtyfQp3b3JsZCA8LSBtYXAoIndvcmxkIiwgcGxvdCA9IEZBTFNFLCBmaWxsID0gVFJVRSkgJT4lIGZvcnRpZnkoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9MTAsIGNhY2hlPVRSVUV9CiMgc2FuaXR5IGNoZWNrIHRoYXQgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSByaWdodCBjb3VudHJ5CiMgd2l0aGluIGEgY291bnRyeSwgYWxsIFhzIHNob3VsZCBiZSB0aGUgc2FtZSBjb2xvcgpnZ3Bsb3QoZGYsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCkpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkLCBhZXMoZ3JvdXAgPSBncm91cCksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAiZ3JleTkwIikgKwogIGdlb21fcG9pbnQoYWVzKGNvbCA9IGNvdW50cnkpLCBzaXplID0gNSwgc2hhcGUgPSA0LCBzdHJva2UgPSAyLCBhbHBoYSA9IC44KSArCiAgY29vcmRfZml4ZWQoMS4zLCB5bGltID0gYygtNTUsIDgzLjU5OTYxKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZCgpICsKICB0aGVtZV9tYXAoKSArCiAgZ3VpZGVzKGNvbCA9ICJub25lIikKYGBgCgpgYGB7cn0KZ2dzYXZlKCIuLi9ncmFwaHMvbWFwLnBkZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDEwLCBzY2FsZSA9IDIpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9Cm0gPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQpKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB3b3JsZCwgYWVzKGdyb3VwID0gZ3JvdXApLCBmaWxsID0gImdyZXk5MCIpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gTnN0dWRpZXMsIGZpbGwgPSBOc3R1ZGllcyksIHNoYXBlID0gMjEsIGFscGhhID0gLjgpICsKICB0aGVtZV9tYXAoKSArCiAgIyAjIHRvIG1ha2UgZmlsbCBpbnRvIGRpc2NyZXRlOyBvdmVybGFwIHdpdGggc2l6ZSBsZWdlbmQKICAjIHNjYWxlX3NpemVfYXJlYSgiTnVtYmVyIG9mXG5TdHVkaWVzIiwgbWF4X3NpemUgPSAxNSkgKwogICMgc2NhbGVfZmlsbF92aXJpZGlzX2MoIk51bWJlciBvZlxuU3R1ZGllcyIsIGd1aWRlID0gImxlZ2VuZCIpICsKICAjIHRvIGhhdmUgdGhlbSBzaWRlIGJ5IHNpZGUKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygiIiwgYnJlYWtzID0gYygxLCAyMCwgNDAsIDYwKSkgKwogIHNjYWxlX3NpemVfYXJlYSgiIiwgbWF4X3NpemUgPSAxNSwgYnJlYWtzID0gYygxLCAyMCwgNDAsIDYwKSkgKwogIHRoZW1lKGxlZ2VuZC5ib3ggPSAiaG9yaXpvbnRhbCIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKHJldmVyc2UgPSBULCBiYXJoZWlnaHQgPSAxMCwgb3JkZXIgPSAwKSwgCiAgICAgICAgIHNpemUgPSBndWlkZV9sZWdlbmQoa2V5aGVpZ2h0ID0gMi42LCB0aXRsZS50aGVtZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNCkpKQoKbGVnZW5kIDwtIGdldF9sZWdlbmQobSkKIyBwbG90X2dyaWQobGVnZW5kKQoKbXggPC0gbSArCiAgYW5ub3RhdGUoInJlY3QiLCB5bWluID0gYygyNCwgMzEsIDI0KSwgeW1heCA9IGMoNDYsIDYyLCA1MCksIHhtaW4gPSBjKDEyNCwgLTEyLCAtMTMwKSwgCiAgICAgICAgICAgeG1heCA9IGMoMTQ2LCAzMiwgLTY0KSwgc2l6ZSA9IC41LCBjb2wgPSAiZ3JleSIsIGZpbGwgPSBOQSkgKyAKICBjb29yZF9maXhlZCgxLjMsIHlsaW0gPSBjKC01NSwgODMuNTk5NjEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCiMjIFpvb20gaW4gb24gc2VjdGlvbnMKCmBgYHtyfQojIGphcGFuCm0xIDwtIG0gKyAKICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkLCBhZXMoZ3JvdXAgPSBncm91cCksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAiZ3JleTkwIiwgbHdkID0gLjIpICsKICBnZW9tX3BvaW50KGFlcyhzaXplID0gTnN0dWRpZXMsIGZpbGwgPSBOc3R1ZGllcyksIHNoYXBlID0gMjEsIGFscGhhID0gLjgpICsKICBjb29yZF9maXhlZCgxLjMsIHlsaW0gPSBjKDI1LCA0NSksIHhsaW0gPSBjKDEyNSwgMTQ1KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHBhbmVsX2JvcmRlcihjb2xvciA9ICJncmV5Iiwgc2l6ZSA9IC41KQoKIyBldXJvcGUKbTIgPC0gbSArIAogIGdlb21fcG9seWdvbihkYXRhID0gd29ybGQsIGFlcyhncm91cCA9IGdyb3VwKSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJncmV5OTAiLCBsd2QgPSAuMikgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBOc3R1ZGllcywgZmlsbCA9IE5zdHVkaWVzKSwgc2hhcGUgPSAyMSwgYWxwaGEgPSAuOCkgKwogIGNvb3JkX2ZpeGVkKDEuMywgeWxpbSA9IGMoMzIsIDYwKSwgeGxpbSA9IGMoLTEwLCAzMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBwYW5lbF9ib3JkZXIoY29sb3IgPSAiZ3JleSIsIHNpemUgPSAuNSkKCiMgY29udGlndW91cyB1cwp1c2EgPSBtYXAoInN0YXRlIiwgcGxvdCA9IEZBTFNFLCBmaWxsID0gVFJVRSkgJT4lIGZvcnRpZnkoKSAjICJ1c2EiCgptMyA8LSBtICsgCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB3b3JsZCwgYWVzKGdyb3VwID0gZ3JvdXApLCBjb2wgPSAiYmxhY2siLCBmaWxsID0gImdyZXk5MCIsIGx3ZCA9IC4yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1c2EsIGFlcyhncm91cCA9IGdyb3VwKSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJncmV5OTAiLCBsd2QgPSAuMikgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBOc3R1ZGllcywgZmlsbCA9IE5zdHVkaWVzKSwgc2hhcGUgPSAyMSwgYWxwaGEgPSAuOCkgKwogIGNvb3JkX2ZpeGVkKDEuMywgeWxpbSA9IGMoMjUsIDQ5KSwgeGxpbSA9IGMoLTEyNywgLTY3KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIHBhbmVsX2JvcmRlcihjb2xvciA9ICJncmV5Iiwgc2l6ZSA9IC41KQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD01LjUsIGNhY2hlPVRSVUV9CmxlZyA8LSBwbG90X2dyaWQoTkEsIGxlZ2VuZCwgbmNvbCA9IDEsIHJlbF9oZWlnaHRzID0gYyguMSwgLjkpLCBsYWJlbHMgPSBjKCIiLCAiTnVtYmVyIG9mIFN0dWRpZXMiKSwgbGFiZWxfeCA9IC0uMzUpCmJvdHRvbV9yb3cgPC0gcGxvdF9ncmlkKG0zLCBtMiwgTkEsIG0xLCBOQSwgbGVnLCBucm93ID0gMSwgcmVsX3dpZHRocyA9IGMoMiwgMS4xOCwgLjA2LCAuODUsIC4wOCwgLjcpKQpwbG90X2dyaWQobXgsIGJvdHRvbV9yb3csIG5jb2wgPSAxLCByZWxfaGVpZ2h0cyA9IGMoMi40LCAxKSkgKwogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKC41LCAuNSwgMS41LCAuNSksICJjbSIpKQpgYGAKCmBgYHtyfQpnZ3NhdmUoIi4uL2dyYXBocy9tYXBfaW5zZXRzLnBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNS41LCBzY2FsZSA9IDIpCmBgYAoKIyBDb2xvciA9IE5vIHNwZWNpZXMKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQptcyA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gbG9uZywgeSA9IGxhdCkpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkLCBhZXMoZ3JvdXAgPSBncm91cCksIGZpbGwgPSAiZ3JleTkwIikgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBOc3R1ZGllcywgZmlsbCA9IE5zcGVjaWVzKSwgc2hhcGUgPSAyMSwgYWxwaGEgPSAuOCkgKwogIHRoZW1lX21hcCgpICsKICAjICMgdG8gbWFrZSBmaWxsIGludG8gZGlzY3JldGU7IG92ZXJsYXAgd2l0aCBzaXplIGxlZ2VuZAogICMgc2NhbGVfc2l6ZV9hcmVhKCJOdW1iZXIgb2ZcblN0dWRpZXMiLCBtYXhfc2l6ZSA9IDE1KSArCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfYygiTnVtYmVyIG9mXG5TdHVkaWVzIiwgZ3VpZGUgPSAibGVnZW5kIikgKwogICMgdG8gaGF2ZSB0aGVtIHNpZGUgYnkgc2lkZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKCIiLCBicmVha3MgPSBjKDEsIDExKSwgY29sb3VycyA9IGMoIiM1OThjZGUiLCIjZDRlMzI0IiwgImJsYWNrIikpICsKICBzY2FsZV9zaXplX2FyZWEoIiIsIG1heF9zaXplID0gMTUsIGJyZWFrcyA9IGMoMSwgMjAsIDQwLCA2MCkpICsKICB0aGVtZShsZWdlbmQuYm94ID0gImhvcml6b250YWwiKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVCwgYmFyaGVpZ2h0ID0gOS41LCBvcmRlciA9IDEpLCAKICAgICAgICAgc2l6ZSA9IGd1aWRlX2xlZ2VuZChrZXloZWlnaHQgPSAyLjYsIHRpdGxlLnRoZW1lID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSkpCgpsZWdlbmQgPC0gZ2V0X2xlZ2VuZChtcykKIyBwbG90X2dyaWQobGVnZW5kKQoKbXN4IDwtIG1zICsKICBhbm5vdGF0ZSgicmVjdCIsIHltaW4gPSBjKDI0LCAzMSwgMjQpLCB5bWF4ID0gYyg0NiwgNjIsIDUwKSwgeG1pbiA9IGMoMTI0LCAtMTIsIC0xMzApLCAKICAgICAgICAgICB4bWF4ID0gYygxNDYsIDMyLCAtNjQpLCBzaXplID0gLjUsIGNvbCA9ICJncmV5IiwgZmlsbCA9IE5BKSArIAogIGNvb3JkX2ZpeGVkKDEuMywgeWxpbSA9IGMoLTU1LCA4My41OTk2MSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKIyMgWm9vbSBpbiBvbiBzZWN0aW9ucwoKYGBge3J9CiMgamFwYW4KbXMxIDwtIG1zICsgCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB3b3JsZCwgYWVzKGdyb3VwID0gZ3JvdXApLCBjb2wgPSAiYmxhY2siLCBmaWxsID0gImdyZXk5MCIsIGx3ZCA9IC4yKSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IE5zdHVkaWVzLCBmaWxsID0gTnNwZWNpZXMpLCBzaGFwZSA9IDIxLCBhbHBoYSA9IC44KSArCiAgY29vcmRfZml4ZWQoMS4zLCB5bGltID0gYygyNSwgNDUpLCB4bGltID0gYygxMjUsIDE0NSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBwYW5lbF9ib3JkZXIoY29sb3IgPSAiZ3JleSIsIHNpemUgPSAuNSkKCiMgZXVyb3BlCm1zMiA8LSBtcyArIAogIGdlb21fcG9seWdvbihkYXRhID0gd29ybGQsIGFlcyhncm91cCA9IGdyb3VwKSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJncmV5OTAiLCBsd2QgPSAuMikgKwogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBOc3R1ZGllcywgZmlsbCA9IE5zcGVjaWVzKSwgc2hhcGUgPSAyMSwgYWxwaGEgPSAuOCkgKwogIGNvb3JkX2ZpeGVkKDEuMywgeWxpbSA9IGMoMzIsIDYwKSwgeGxpbSA9IGMoLTEwLCAzMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBwYW5lbF9ib3JkZXIoY29sb3IgPSAiZ3JleSIsIHNpemUgPSAuNSkKCiMgY29udGlndW91cyB1cwp1c2EgPSBtYXAoInN0YXRlIiwgcGxvdCA9IEZBTFNFLCBmaWxsID0gVFJVRSkgJT4lIGZvcnRpZnkoKSAjICJ1c2EiCgptczMgPC0gbXMgKyAKICBnZW9tX3BvbHlnb24oZGF0YSA9IHdvcmxkLCBhZXMoZ3JvdXAgPSBncm91cCksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAiZ3JleTkwIiwgbHdkID0gLjIpICsKICBnZW9tX3BvbHlnb24oZGF0YSA9IHVzYSwgYWVzKGdyb3VwID0gZ3JvdXApLCBjb2wgPSAiYmxhY2siLCBmaWxsID0gImdyZXk5MCIsIGx3ZCA9IC4yKSArCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IE5zdHVkaWVzLCBmaWxsID0gTnNwZWNpZXMpLCBzaGFwZSA9IDIxLCBhbHBoYSA9IC44KSArCiAgY29vcmRfZml4ZWQoMS4zLCB5bGltID0gYygyNSwgNDkpLCB4bGltID0gYygtMTI3LCAtNjcpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgcGFuZWxfYm9yZGVyKGNvbG9yID0gImdyZXkiLCBzaXplID0gLjUpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTUuNSwgY2FjaGU9VFJVRX0KbGVncyA8LSBwbG90X2dyaWQoTkEsIGxlZ2VuZCwgbmNvbCA9IDIsIHJlbF9oZWlnaHRzID0gYyguMSwgLjkpLCBsYWJlbHMgPSBjKCJTcGVjaWVzIiwgIlN0dWRpZXMiKSwgbGFiZWxfeCA9IC0uMSkKYm90dG9tX3JvdyA8LSBwbG90X2dyaWQobXMzLCBtczIsIE5BLCBtczEsIE5BLCBsZWdzLCBucm93ID0gMSwgcmVsX3dpZHRocyA9IGMoMiwgMS4xOCwgLjA2LCAuODUsIC4wOCwgLjcpKQpwbG90X2dyaWQobXN4LCBib3R0b21fcm93LCBuY29sID0gMSwgcmVsX2hlaWdodHMgPSBjKDIuNCwgMSkpICsKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYyguNSwgLjUsIDEuNSwgLjUpLCAiY20iKSkKYGBgCgpgYGB7cn0KZ2dzYXZlKCIuLi9ncmFwaHMvbWFwX2luc2V0c19jb2xfc3BlY2llcy5wZGYiLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUuNSwgc2NhbGUgPSAyKQpgYGAKCgoqKioKCiMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK